//
//  SYStatus.swift
//  SingWeibo
//
//  Created by shiying on 15/12/20.
//  Copyright © 2015年 shiying. All rights reserved.
//

import UIKit
import SDWebImage

class SYStatus: NSObject {
    /// 用户的ID
    var id: Int = 0
    
    /// 转发数
    var reposts_count: Int = 0
    
    /// 评论数
    var comments_count: Int = 0
    
    /// 表态数
    var attitudes_count: Int = 0
    
    
    /// 微博信息内容
    var text: String? {
        didSet{
            attrText = SYEmoticon.stringToEmoticonText(text ?? "")
        }
    }
    var attrText: NSAttributedString? /// 带表情图片的属性文本
    
    /// 微博来源
    var source:String? {
        didSet{
            source = source?.source() // kvc设置来源之后，我们再重新来设置来源，再次赋值给source，在didSet里面设置属性不会调用属性监视器的
        }
    }
    
    /// 微博创建时间
    var created_at: String?
    
    /// 用户模型
    var user: SYUser?
    
    /// 评论模型
    var comments: SYComments?
    
    /// 缓存行高
    var rowHeight: CGFloat?
    
    /// 转发微博模型
    var retweeted_status: SYStatus?
    
    func cellID() -> String {/// 如果有retweeted_status那么就是转发微博，没有就是原创微博
        return retweeted_status == nil ? SYStatusCellReuseIdentifier.SYStatusNormalCell.rawValue : SYStatusCellReuseIdentifier.SYStatusForwardCell.rawValue
    }
    
    /// 微博的配图
    var pic_urls: [[String: AnyObject]]? {// 数组里面全是字典
        
        didSet {
            let count = self.pic_urls?.count ?? 0
            if count == 0 {
                return // 没有图片就返回
            }
            
            storePictureURLs = [NSURL]()
            
            largeStorePictureURLs = [NSURL]() /// 创建大图的数组
            
            
            
            for dict in pic_urls! {
              
                let urlString = dict["thumbnail_pic"] as! String
                let url = NSURL(string: urlString)!
                storePictureURLs?.append(url)
                
                let largeURLString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                let largeURL = NSURL(string: largeURLString)!
                largeStorePictureURLs?.append(largeURL)
                
            }
        }
    }
    var largeStorePictureURLs: [NSURL]?/// 微博大图数组
    
    var largePictureURLs: [NSURL]? { // 如果是原创的，就显示原创大图，如果是转发的就转发的大图
        return retweeted_status == nil ? largeStorePictureURLs : retweeted_status?.largeStorePictureURLs
    
    }
    
    // 微博配图的NSURL数组，原创微博的配图URL
    var storePictureURLs: [NSURL]? /// 原创微博的配图
    
    // 如果等于空，那么就是原创图片，反之是转发的
    var pictureURLs: [NSURL]? {
        return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
    }
    
    /// KVC
    init(dict: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dict)
    }
    // KVC 没有这个属性在里面必须调用这个方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    //MARK: - 取出用户的模型
    override func setValue(value: AnyObject?, forKey key: String) {
        
        // 在Status 里面找到相对应的KEY "user"  ,获取里面的模型
        if key == "user" {
            if let dict = value as? [String: AnyObject] {
                
                let dictModel = SYUser(dict: dict)
                self.user = dictModel

            }
            return// 必须return，不然会调用父类的方法
        }
        
        /// 转发微博字典转模型
        if key == "retweeted_status" {
            if let dict = value as? [String: AnyObject] {
                
                self.retweeted_status = SYStatus(dict: dict)// 字典转模型

            }
            return
        }
        
        /// 评论
        if key == "comments" {
            if let dict = value as? [String: AnyObject] {

                
                let dictCom = SYComments(dict: dict)
                self.comments = dictCom

            }
            return
        }
        
        // 调用父类方法
        super.setValue(value, forKey: key)
    }
    
    //MARK: - 字典转模型
    override var description: String {
        let prop = ["id", "reposts_count", "comments_count", "attitudes_count", "text", "source", "pic_urls", "user", "retweeted_status", "comments"]
        let dict = dictionaryWithValuesForKeys(prop)
        return "\n\t微博数据\(dict)"
    }
    
    //MARK: - 加载微博数据
    class func loadStatusModel(since_id: Int, max_id: Int,finished:(statuses: [SYStatus]?,error: NSError?) ->()) {
        
        // 调用网络工具类传过来的微博数据
        SYStatusDAL.sharedInstance.loadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            if error != nil {
                finished(statuses: nil, error: error)
                return
            }
            
            // 加载数据没有出错，来字典转模型
            if let array = statuses {
            
                var statusesModel = [SYStatus]()
                
                for dict in array {
                    statusesModel.append(SYStatus(dict: dict))
                }
            
                // 字典转模型完毕
                // 缓存单张图片
                cachedWebImage(statusesModel, finished: finished)
            } else {
                finished(statuses: nil, error: nil)
            }
 
        }
    }
            // 如果有错，直接返回
          /*  if error != nil || result  == nil {
                finished(statuses: nil, error: error)
                return
            }
            // 字典转模型
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                
                //定义可变数组
                var statuses = [SYStatus]()
                
                //遍历字典数组
                for dict in array {
                    
                    let status = SYStatus(dict: dict)// 字典模型
                    statuses.append(status)// 添加
                    
                }
//                    finished(statuses: statuses, error: nil)// 将所有的数组模型，转成字典模型，告诉调用的人转完
                // 下载图片
                cachedWebImage(statuses, finished: finished)
                } else {
                    finished(statuses: nil, error: nil)
                }
            }
        }*/
    
    
    class func cachedWebImage(statuses: [SYStatus], finished: (statuses: [SYStatus]?, error: NSError?) -> ()){
        
        /// 设置一个长度属性，记录缓存图片的大小
        var length = 0.0
        
        let group = dispatch_group_create()
        
        // 1. 遍历所有的数组
        for status in statuses {
            // 2.判断模型是否有图片
            guard let urls = status.pictureURLs else {
            // 2.1 没有图片就往下跳
                continue
            }
            // 3.有图片就，遍历所有缓存的图片
            //有一张图上就的先缓存， 多张的在显示之后再缓存，可以减少缓存时间
            
            if urls.count == 1{
                
                let url = urls[0] // 获取只有一张图片的微博
                // 进入组
                dispatch_group_enter(group)
                
                // 3.1 用SDWebView 缓存图片 // 异步执行
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    dispatch_group_leave(group) // 离开组  离开之后通知下载完成
                    
                    if error != nil {
//                        print("图片出错")
                        return
                    }
                    
//                    print("缓存图片成功")
                    let data = UIImagePNGRepresentation(image)!
                     length += Double(data.length)
                })
            }
        }
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("文件下载总长度 \(length / 1024 / 1024)M")
            finished(statuses: statuses, error: nil) // 通知别人闭包回调
        }
    }
   }

